#include "XSLStylesheet.h"
#include "../XML/Texte.h"

XSLStylesheet::XSLStylesheet(Balise* uneXSLStruct) {
	this->xslStruct = uneXSLStruct;

	//parcourir la XSLStruct pour construite la map nomBalise/balise*
	list<Balise*> xslTemplates = uneXSLStruct->getListeBaliseFils();
	for (list<Balise*>::iterator it = xslTemplates.begin() ; it != xslTemplates.end() ; ++it) {

		if ((*it)->getAttributWithName("match") != NULL) 
			baliseMap[(*it)->getAttributWithName("match")->getValeur()] = *it; //TODO: vérifier le résultat
		else
			cout << "erreur, un template n'a pas d'attribut match!" << endl;

	}

}

//TODO: test this function
Noeud* XSLStylesheet::makeXSLDeepCopy(Noeud* unNoeud) {
	if (unNoeud->getType() == TEXTE_e) {
		return new Texte(((Texte*)unNoeud)->getValeur());
	} else { //BALISE_e
		if (((Balise*)(unNoeud))->getNomAvecEspace().compare("xsl:apply-templates") == 0)
			return this->getApplyTemplates();
		else { // balise normale
			Balise* copie = new Balise(((Balise*)unNoeud)->getNomAvecEspace(), ((Balise*)unNoeud)->estSimple());

			list<Noeud*> listeFils = ((Balise*)unNoeud)->getFils();
			for (list<Noeud*>::iterator it = listeFils.begin() ; it != listeFils.end() ; ++it) {
				copie->ajouterFils(this->makeXSLDeepCopy(*it));
			}

			vector<Attribut*> listeAttribut = ((Balise*)unNoeud)->getAttributs();
			for (vector<Attribut*>::iterator it = listeAttribut.begin() ; it != listeAttribut.end() ; ++it) {
				Attribut* copieAttribut = new Attribut((*it)->getNom(), (*it)->getValeur());
				copie->ajouterAttribut(copieAttribut);
			}

			return copie;
		}
	} 
}

Balise* XSLStylesheet::getApplyTemplates() const {
	static Balise* applyTemplatesBalise = new Balise("xsl:apply-templates", true);
	return applyTemplatesBalise;
}



bool XSLStylesheet::getCopiePTemplateContent(string nomBalise, list<Noeud*> & listeFilsRef) {
	xslMatchMap_t::iterator mapIt = this->baliseMap.find(nomBalise);

	if (mapIt == this->baliseMap.end())
		return false;

	listeFilsRef.clear(); //on retire tous les éléments présents à la base
	list<Noeud*> filsXSL = mapIt->second->getFils();
	for (list<Noeud*>::iterator it = filsXSL.begin() ; it != filsXSL.end() ; ++it) {
		listeFilsRef.push_back(this->makeXSLDeepCopy(*it));
	}

	return true;
}


